package classesdao;

import classesbean.*;
import java.sql.*;
import conexaobd.ConectaBD;
import java.util.ArrayList;

public class LivroDAO {
    //Método usado para fazer a inserçao
    public void inserir(Livro l){
        ConectaBD.abreConexao();
        String sql = "insert into tb_livro values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        try{
            PreparedStatement pst = ConectaBD.prepare(sql);
            pst.setString(1, null);
            pst.setString(2, l.getTitulo());
            pst.setString(3, l.getPublicacao());
            pst.setString(4, l.getLocalizacao());
            pst.setString(5, l.getEdicao());
            pst.setString(6, l.getVolume());
            pst.setString(7, l.getCdu());
            pst.setString(8, l.getIsbn());
            pst.setString(9, l.getSinopse());
            pst.setString(10, l.getFoto());
            pst.setInt(11, l.getAssunto().getId_assunto());
            pst.setInt(12, l.getCategoria().getId_categoria());
            pst.setInt(13, l.getTipo().getId_tipo());
            pst.setInt(14, l.getEditora().getId_editora());
            pst.executeUpdate(); 
        }catch(Exception erro){
            System.out.println("Erro " + erro.getMessage());
        }
        
        ConectaBD.fechaConexao();
    }
    //Método usado para consulta
    public ArrayList<Livro> pesquisaCategoria(String c, int inicio, int fim){
        String sql = "SELECT l.* from tb_livro as l "
                    + "INNER JOIN tb_categoria as c "
                    + "ON c.id_categoria=l.fk_categoria "
                    + "where c.categoria like '%"+c+"%' limit "+inicio+","+fim;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
       
        ArrayList<Livro> lista = carregaLista(res);
        ConectaBD.fechaConexao();
        return lista;
    }
    public ArrayList<Livro> carregaLista(ResultSet res){
        ArrayList<Livro> lista = new ArrayList<Livro>();
        try{
            while(res.next()){
                Livro l = new Livro();
                l.setId_livro(res.getInt("id_livro"));
                l.setTitulo(res.getString("titulo"));
                l.setPublicacao(res.getString("publicacao"));
                l.setLocalizacao(res.getString("localizacao"));
                l.setEdicao(res.getString("edicao"));
                l.setVolume(res.getString("volume"));
                l.setCdu(res.getString("cdu"));
                l.setIsbn(res.getString("isbn"));
                l.setSinopse(res.getString("sinopse"));
                l.setFoto(res.getString("foto"));
                l.setCategoria(new CategoriaDAO().pesquisar(res.getInt("fk_categoria")));
                l.setTipo(new TipoDAO().pesquisar(res.getInt("fk_tipo")));
                l.setEditora(new EditoraDAO().pesquisar(res.getInt("fk_editora")));
                l.setAssunto(new AssuntoDAO().pesquisar(res.getInt("fk_assunto")));
                AutorDAO autorDAO = new AutorDAO();
                l.setAutor(autorDAO.pesquisaAutorLivro(l.getId_livro()));
                lista.add(l);          
            }
        }catch(Exception erro){
            System.out.println(erro.getMessage());
        }
        return lista;
    }
    public ArrayList<Livro> pesquisaSinopse(String s, int inicio, int fim){
        String sql = "select l.* from tb_livro as l where sinopse like '%"+s+"%' limit "+inicio+","+fim;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
        
        ArrayList<Livro> lista = carregaLista(res);
        ConectaBD.fechaConexao();
        return lista;
    }
    //Método usado para consulta
    public ArrayList<Livro> pesquisaTitulo(String t, int inicio, int fim){
        String sql = "select l.* from tb_livro as l where titulo like '%"+t+"%' limit "+inicio+","+fim;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
       
        ArrayList<Livro> lista = carregaLista(res);
        ConectaBD.fechaConexao();
        return lista;
    }
    public ArrayList<Livro> pesquisaAutor(String a, int inicio, int fim){
        String sql = "select l.* from tb_livro as l "
                    + "INNER JOIN tb_livro_for_tb_autor as t "
                    + "ON t.id_livro=l.id_livro "
                    + "INNER JOIN tb_autor as a "
                    + "ON a.id_autor=t.id_autor "
                    + "where a.autor like '%"+a+"%' limit "+inicio+","+fim;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
        
        Livro l = new Livro();
        
        ArrayList<Livro> lista = carregaLista(res);
        ConectaBD.fechaConexao();
        return lista;
    }
    public ArrayList<Livro> pesquisaTudo(String t, int inicio, int fim){
        String sql = "select distinct l.* from tb_livro as l "
                    + "INNER JOIN tb_categoria as c "
                    + "ON c.id_categoria=l.fk_categoria "
                    + "INNER JOIN tb_livro_for_tb_autor as tbl "
                    + "ON tbl.id_livro=l.id_livro "
                    + "INNER JOIN tb_autor as a "
                    + "ON tbl.id_autor=a.id_autor "
                    + "where ((l.titulo like '%"+t+"%') or (l.sinopse like '%"+t+"%') or (a.autor like '%"+t+"%') or "
                    + "(c.categoria like '%"+t+"%')) limit "+inicio+","+fim;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
        
        Livro l = new Livro();
        ArrayList<Livro> lista = carregaLista(res);
        ConectaBD.fechaConexao();
        return lista;
    }
     //Método usado para consulta
    public Livro consulta(int id){
        String sql = "select l.* from tb_livro as l where id_livro="+id;
        ConectaBD.abreConexao();
        ResultSet res = ConectaBD.executaConsulta(sql);
       
        Livro l = new Livro();
  
        try{
            if(res.next()){
                l.setId_livro(res.getInt("id_livro"));
                l.setTitulo(res.getString("titulo"));
                l.setPublicacao(res.getString("publicacao"));
                l.setLocalizacao(res.getString("localizacao"));
                l.setEdicao(res.getString("edicao"));
                l.setVolume(res.getString("volume"));
                l.setCdu(res.getString("cdu"));
                l.setIsbn(res.getString("isbn"));
                l.setSinopse(res.getString("sinopse"));
                l.setFoto(res.getString("foto"));
                l.setCategoria(new CategoriaDAO().pesquisar(res.getInt("fk_categoria")));
                l.setTipo(new TipoDAO().pesquisar(res.getInt("fk_tipo")));
                l.setEditora(new EditoraDAO().pesquisar(res.getInt("fk_editora")));
                l.setAssunto(new AssuntoDAO().pesquisar(res.getInt("fk_assunto")));
                AutorDAO autorDAO = new AutorDAO();
                l.setAutor(autorDAO.pesquisaAutorLivro(l.getId_livro()));       
            }
        }catch(Exception erro){
            System.out.println(erro.getMessage());
        }
        ConectaBD.fechaConexao();
        return l;
    }
    //Método para exclusao
    public void delete(int id){
        String sql = "delete from tb_livro where id_livro = '"+ id + "';";
        ConectaBD.abreConexao();
        ConectaBD.executaSQL(sql);
        ConectaBD.fechaConexao();
    }
    //Método para atualizaçao
    public void atualizar(Livro l, int id){
        String sql = "update tb_livro set titulo= '"+ l.getTitulo()+ ", publicacao='"+l.getPublicacao()
                    +"', localizacao='"+l.getLocalizacao()+"', edicao='"+l.getEdicao()+"', volume='"
                    +l.getVolume()+ "', cdu='"+l.getCdu()+"', isbn='"+l.getIsbn()+"', sinopse='"+l.getSinopse()
                    +"', foto='"+l.getFoto()+"', assunto='"+l.getAssunto()+"', categoria='"+l.getCategoria()
                    + "', tipo='"+l.getTipo()+"', editora='"+l.getEditora()+"' WHERE id_autor = '" +id+"'"; 
        ConectaBD.abreConexao();
        ConectaBD.executaSQL(sql);
        ConectaBD.fechaConexao();
    }
}